package com.titaniume.java1;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.util.ArrayList;

/**
 *@program: JavaSenior
 *@description:
 * 1.annocation注解定义
 * ①.jdk5新增的功能
 * ②.Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加
 * 载, 运行时被读取, 并执行相应的处理。通过使用 Annotation, 程序员
 * 可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。代
 * 码分析工具、开发工具和部署工具可以通过这些补充信息进行验证
 * 或者进行部署。
 *
 * ③.在JavaSE中，注解的使用目的比较简单，例如标记过时的功能，
 * 忽略警告等。在JavaEE/Android中注解占据了更重要的角色，例如
 * 用来配置应用程序的任何切面，代替JavaEE旧版中所遗留的繁冗
 * 代码和XML配置等
 *
 *
 * 2.annocation的使用示例
 * 示例一：生成温度的相关注解
 * 示例二：在编译是进行格式检查（JDK内置的三个基本注解）
 * @Override: 限定重写父类的方法，改注解只能用于方法
 * @Deprecated: 用于表示所修饰的元素（类，方法等） 已过时通常是因为所修饰的结构危险或存在更好的选择
 * @SuppressWarnings:抑制编译器警告
 *
 *
 * 3.如何自定义注解
 * ①：注解声明为@interface
 * ②：内部定义成员，通常使用value表示
 * ③：可以指定成员的默认值，使用default定义
 * ④：如果自定义注解没有成员，表明是一个标识作用
 *
 *
 * 如果注解有成员，在使用注解时，需要指明成员的值
 * 自定义注解必须配上注解的信息处理流程(使用反射)才有意义
 *自定义注解通常会指明两个元注解，Retention 、Target
 *
 *
 * 4.jdk提供的4种元注解
 * 元注解：对现有的注解进行解释说明的注解
 * Retention 指定所修饰的Annotation的生命周期 SOURCE\CLASS(默认)\RUNTIME
 * 只有声明为RUNTIME声明周期的注解，才能通过反射获取
 * Target 用于指定修饰Annotation能修饰的哪些元素
 * ***********出现的频率较低*********
 * Documented 表示所修饰的注解被javadoc解析时保留下来
 * Inherited 被它修饰的 Annotation 将具有继承性。
 *
 * 5.通过反射获取注解信息------------到反射详细讲解
 * 6.jdk8 中注解的新特性： 可重复注解，类型注解
 * 6.1：可重复注解：①在MyAnnotion上声明一个Repeatable 成员值为MyAnnotions.class
 *               ②：MyAnnotin的target和Retention和MyAnnotinos相同
 * 6.2 类型注解
 *  ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语 句中（如：泛型声明）。
 *  ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
 *
 *
 *@author: renfei.huang
 *@create: 2021-10-11 09:02
 */
public class  AnnotationTest {


    public static void main(String[] args) {

        Person p = new Student();
        p.walk();

        @SuppressWarnings("unused")
        int num = 10;

        @SuppressWarnings({"unused","rawtypes"})
        ArrayList arrayList = new ArrayList();


    }

    @Test
    public void  test(){

        Class clazz = Student.class;
        Annotation[] annotations = clazz.getAnnotations();
        for (int i = 0; i < annotations.length ; i++) {
            System.out.println(annotations[i]);
        }
    }

}


//jdk8之前的写法
//@MyAnnotations({@MyAnnotation(value = "hi"),@MyAnnotation(value = "abc")})

@MyAnnotation(value = "hi")
@MyAnnotation(value = "abc")
class  Person{

    private String name;
    private int age;

    public Person() {

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void walk(){
        System.out.println("人走路");
    }

    public void eat(){
        System.out.println("人吃饭");
    }
}

interface   Info1 {
    void  show();
}

class  Student extends  Person implements  Info1{

    @Override
    public void walk() {
        System.out.println("学生走路");
    }

    @Override
    public void eat() {
        System.out.println("学生吃饭");
    }

    public  void show(){

    }
    //@Deprecated 例如Date类的过时方法
//    @Deprecated
//    public Date(String s) {
//        this(parse(s));
//    }

}

class  Generic<@MyAnnotation T>{

    public  void show() throws @MyAnnotation RuntimeException{

        ArrayList<@MyAnnotation String> list = new ArrayList<>();

        int num =(@MyAnnotation int ) 10L;



    }

}
